package `object`

/**
 *   @author
 *   @description
 *   @datetime 2021/6/16 13:50
 *有时候，业务逻辑需要围绕某种类型创建包装器。然⽽，由于额外的堆内存分配问题，它会引⼊运⾏时的
性能开销。此外，如果被包装的类型是原⽣类型，性能的损失是很糟糕的，因为原⽣类型通常在运⾏时就
进⾏了⼤量优化，然⽽他们的包装器却没有得到任何特殊的处理。
为了解决这类问题，Kotlin 引⼊了⼀种被称为 内联类 的特殊类
 */
class InlineClassDemo {
}

// 内联类必须含有唯⼀的⼀个属性在主构造函数中初始化。在运⾏时，将使⽤这个唯⼀属性来表⽰内联类
// 的实例
inline class Password(val value: String)

// 内联类⽀持普通类中的⼀些功能。特别是，内联类可以声明属性与函数
//然⽽，内联类的成员也有⼀些限制：
//内联类不能含有 init 代码块
//内联类不能含有幕后字段
//因此，内联类只能含有简单的计算属性（不能含有延迟初始化/委托属性）
inline class Name(val s: String) {
    val length: Int
        get() = s.length
    fun greet() {
        println("Hello, $s")
    }
}

// 内联类允许去继承接⼝
// 禁⽌内联类参与到类的继承关系结构中。这就意味着内联类不能继承其他的类⽽且必须是 final。
interface Printable {
    fun prettyPrint() : String
}

inline class PersonName(val s: String) : Printable {
    override fun prettyPrint(): String = "HI, $s"
}
